﻿/*
 * Создан: Оникийчук Антон Игоревич
 * Компания: ООО "ИМСАТ"
 * Дата создания: 21.01.2009
 * Время создания: 10:28
 * Emal разработчика: onikiychuka@gmail.com
 */
using System.Xml;

namespace IMSAT.OFTD.DOM
{
    /// <summary>
    /// Класс отвечающий за отображение свойства.
    /// </summary>
    public class Property : Node
    {
        private string _name = "";


        private XmlNamespace _namespace;
        private string _value = "";

        public Property()
        {
        }

        public Property(string name, XmlNamespace nsp)
        {
            _name = name;
            _namespace = nsp;
        }

        /// <summary>
        /// Имя свойства
        /// </summary>
        public string Name
        {
            get { return _name; }
        }

        /// <summary>
        /// Значение свойства
        /// </summary>
        public string Value
        {
            get { return _value; }
            set { _value = value; }
        }

        /// <summary>
        /// Пространство имен свойства
        /// </summary>
        public XmlNamespace Namespace
        {
            get { return _namespace; }
        }
        public PropertyData GetData()
        {
            return new PropertyData(Name, Value, Namespace);
        }
        

        #region Nested type: PropertyAppender

        public abstract class PropertyAppender : NodeAppender
        {
            public PropertyAppender(Property property) : base(property)
            {
            }

            protected Property CurProperty
            {
                get { return CurNode as Property; }
            }

            protected string Name
            {
                get { return CurProperty.Name; }
                set { CurProperty._name = value; }
            }

            protected string Value
            {
                get { return CurProperty.Value; }
                set { CurProperty._value = value; }
            }

            protected XmlNamespace Namespace
            {
                get { return CurProperty.Namespace; }
                set { CurProperty._namespace = value; }
            }

            protected override object GetPropertyByName(string name)
            {
                return base.GetPropertyByName(name);
            }

            protected override void SetProperyByName(string name, object val)
            {
                base.SetProperyByName(name, val);
            }
        }

        #endregion

        #region Nested type: Reader

        public class Reader : NodeXmlReader
        {
            protected override bool CheckReader(XmlReader rd, bool _prevRes, Node parentNode)
            {
                if (_prevRes)
                {
                    var nspm = new OFTDCommonNamespaceManager();
                    string ns = rd.NamespaceURI;
                    if (ns == nspm.OFTDAShapesNamespace.Namespace)
                        return true;
                    if (ns == nspm.OFTDPropertyPlaceNamespace.Namespace)
                        return true;
                    return false;
                }
                return base.CheckReader(rd, _prevRes, parentNode);
            }

            protected override Node InitNode(XmlReader reader, Node initedNode)
            {
                if (initedNode == null)
                {
                    initedNode = new Property();
                }
                var p = initedNode as Property;
                if (p != null)
                {
                    p._namespace = new XmlNamespace(reader.NamespaceURI, reader.Prefix);
                    int cnt = reader.AttributeCount;
                    for (int i = 0; i < cnt; i++)
                    {
                        reader.MoveToAttribute(i);
                        if (reader.LocalName == "Имя")
                        {
                            p._name = reader.Value;
                        }
                        else
                        {
                            var prop = new Property(reader.LocalName,
                                                    new XmlNamespace(reader.NamespaceURI, reader.Prefix));
                            prop.Value = reader.Value;
                            p.AppendChild(prop);
                        }
                        reader.MoveToElement();
                    }
                    try
                    {
                        p._value = reader.ReadElementString();
                    }
                    catch (XmlException e)
                    {
                    }
                }
                return base.InitNode(reader, initedNode);
            }

            protected override Node InitObjectAfterBuild(Node result)
            {
                return base.InitObjectAfterBuild(result);
            }
        }

        #endregion
        public struct PropertyData
        {
            private string _name;
            private string _value;
            private XmlNamespace _ns;
            public PropertyData(string name, string value, XmlNamespace ns)
            {
                _name = name;
                _value = value;
                _ns = ns;
            }
            public string Name
            {
                get{return _name;}
                set {_name = value;}

            }
            public string Value
            {
                get { return _value; }
                set { _value = value; }
            }

            public XmlNamespace Namespace
            {
                get { return _ns; }
                set { _ns = value; }
            }
        }
    }
    
}